import router from './router'
import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { Message } from 'element-ui'
import { getToken } from '@/utils/auth' // getToken from cookie

NProgress.configure({ showSpinner: false })// NProgress configuration

const whiteList = ['/login'] // 不重定向白名单
router.beforeEach((to, from, next) => {
/**
 * 项目启动的时候，首先从/ （from）进入，重定向到/dashboard（to），此时没有登录，不能进入首页，需要重定向到登录页/login?redirect=' + to.path。
 * 项目重定向到登录页的时候，变成从/ （from）进入 /login?redirect=%2Fdashboard（to） ，此时就跳转到了登录页。
 * 在登录页点击登录的时候，从 /login?redirect=%2Fdashboard（from）进入，到/dashboard（to）首页，这个时候有了token，可以去获取用户信息
 */
  NProgress.start()
  if (getToken()) { // 判断是否有token
    // 如果有的话就，判断是否要进入登录页
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done() // 如果当前页面是首页，每个钩子都不会触发，所以手动处理它
    } else {
      if (store.getters.roles.length === 0) {
        store.dispatch('GetInfo').then(res => { // 拉取用户信息
          const roles = res.data.roles
          const menuList = res.data.menuList
          const userInfo = { roles: roles, menuList: menuList }
          // 根据角色生成可访问路由映射
          store.dispatch('GenerateRoutes', userInfo).then(() => {
            router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,设置replace: true，以便导航不会留下历史记录
          })
        }).catch((err) => {
          store.dispatch('FedLogOut').then(() => {
            Message.error(err || '验证失败，请重新登录')
            next({ path: '/' })
          })
        })
      } else {
        next()
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      // 在不重定向白名单，直接去
      next()
    } else {
      // 没有访问权限的其他页面被重定向到登录页面。
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done() // 结束Progress
})
